package cn;
//单链表
import java.util.Scanner;

public class LinkList  {
    public Node head;//单链表的头指针
    public LinkList(){
        head=new Node();//初始化头结点
    }
    public LinkList(int n,boolean Order)throws Exception{
        this();//初始化头结点
        if(Order){
            createl(n);
        }
        else
        create2(n);
    }
    public void createl(int n) throws Exception {
        Scanner sc=new Scanner(System.in);
        for(int j=0;j<n;j++){
            insert(length(),sc.next());
        }
         sc.close();

    }
    public void create2(int n) throws Exception {
        Scanner sc=new Scanner(System.in);
        for(int j=0;j<n;j++)
        insert(0, sc.next());
        sc.close();
    }//将一个带有头结点的制成空表
    public void clear(){
        head.date=null;
        head.next=null;

    }
    //判断一个带头结点的单链表是否为空
    public boolean isEmpty(){
        return head.next==null;
    }
    //求带头结点的单链表的长度
    public int length(){
        Node p=head.next;//初始化，p指向首结点，length为计数器
        int length=0;
        while(p!=null){
            p=p.next;
            ++length;
        }
        return length;
    }//读取带头结点的单链表中的第i个结点
    public Object get(int i) throws Exception{
        Node p=head.next;//初始化，p指向首结点，j为计数器
        int j=0;
        while(p!=null&&j<i){
            p=p.next;
            ++j;
            if(j>i||p==null){
                throw new Exception("第"+i+"个元素不存在");
            }
            
        }
        return p.date;
        
              
    }//按值查找算法
    public int indexOf(Object x){
        Node p=head.next;//初始化，p指向首结点，j为计数器
        int j=0;
        while(p!=null&&!p.date.equals(x)){
            p=p.next;
            ++j;
        }
        if(p!=null){
            return j;
        }else
        return -1;
    }
    public void insert(int i,Object x)throws Exception{
        Node p=head;//初始化，p为头结点，j为计数器
        int j=-1;
        while(p!=null&&j<i-1){//寻找第i个结点的前驱
            p=p.next;
            ++j;
        }
        if(j>i-1||p==null){
            throw new Exception("插入位置不合法");
        }
        Node s=new Node(x);
        s.date=p.next;
        p.date=s;
    }
     public void remove(int i)throws Exception{
         Node p=head;//初始化，p为头结点，j为计数器
         int j=-1;
         while(p.next!=null&&j<i-1){//寻找第i个结点的前驱
             p=p.next;
             ++j;
         }
         if(p.next==null||j>i-1){
             throw new Exception("插入位置不合法");
         }
         p.next=p.next.next;
     }
     public void display(){
         Node p=head.next;//取出带头结点的单链表中的首结点
         while(p!=null){
             System.out.println(p.date+"");//输出节点值
         }
         System.out.println();
     }
     
}
